package ejercicio.practica8;

import static java.lang.Thread.sleep;

class Marmita {
    //True si el comensal debe esperar a reponer la marmita
    //false si el cocinero debe esperar a que se vacie la marmita.

    private boolean vacia = true;
    volatile int anguilas = 0;
    //monitor
    private Object lock = new Object();

    public void comer() throws InterruptedException {
        synchronized (lock) {
            //Espera hasta que existan anguilas
            while (vacia) {
                try {
                    lock.wait();
                } catch (InterruptedException ex) {
                      System.out.println("Error: " + ex);
                }
            }
            anguilas--;
            System.out.println("Vikingo comiendo una anguila");
            sleep(1000);
            if (anguilas <= 0) {
                vacia = true;
                //Notitificar que se ha vaciado la marmita.
                lock.notifyAll();
            }
        }
        
        
    }

    public void reponer() throws InterruptedException {
        synchronized (lock) {
            //Espera si la marmita dispone de anguilas
            while (!vacia) {
                try {
                    lock.wait();
                } catch (InterruptedException ex) {
                      System.out.println("Error: " + ex);
                }
            }
            System.out.println("Vikingo reponiendo la marmita");   
             sleep(1000);
            anguilas = 5;
            vacia = false;
            //Notificamos que se ha repuesto la marmita.
            lock.notifyAll();
        }
    }
}

class Comensal implements Runnable {

    private Marmita marmita;

    public Comensal(Marmita marmita) {
        this.marmita = marmita;
    }

    public void run() {
        while (true) {
            try {
                marmita.comer();
            } catch (InterruptedException ex) {
                System.out.println("Error: " + ex);
            }
        }
    }

}

class Cocinero implements Runnable {

    private Marmita marmita;

    public Cocinero(Marmita marmita) {
        this.marmita = marmita;
    }

    public void run() {
        while (true) {
            try {
                marmita.reponer();
            } catch (InterruptedException ex) {
                  System.out.println("Error: " + ex);
            }
        }
    }

}

public class drakkarVikingo {

    public static void main(String args[]) {
        Marmita marmita = new Marmita();
        (new Thread(new Cocinero(marmita))).start();
        (new Thread(new Comensal(marmita))).start();
    }

}
